package jp.co.nes.awssupport.sforce.batch;

import java.time.YearMonth;
import java.util.List;
import java.util.Map;

import org.apache.commons.lang3.StringUtils;
import org.kohsuke.args4j.Option;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import jp.co.nes.awssupport.business.bean.CommonContainerBean;
import jp.co.nes.awssupport.business.bean.CommonContainerBean.ProcessingResult;
import jp.co.nes.awssupport.business.bean.CommonInfoBean;
import jp.co.nes.awssupport.business.constant.OtherKeyForTargetYearMonth;
import jp.co.nes.awssupport.business.logic.CompileProgressManage;
import jp.co.nes.awssupport.business.logic.ContractInformationManage;
import jp.co.nes.awssupport.common.base.AbstractActivityTaskClient;
import jp.co.nes.awssupport.common.base.CommonException;
import jp.co.nes.awssupport.common.utility.BeanUtil;
import jp.co.nes.awssupport.common.utility.DateUtil;

/**
 * Sforceデータダウンロードです。<br>
 * サポートポータルから契約情報をダウンロードします。
 */
public class SforceDownload extends AbstractActivityTaskClient<CommonInfoBean, CommonContainerBean<CommonInfoBean>> {

    /** ロガー */
    private static Logger logger = LoggerFactory.getLogger(SforceDownload.class);

    /** アクティビティのarn(コマンドライン引数で設定) */
    @Option(name = "-aarn", aliases = "--activityArn", usage = "アクティビティのarn", metaVar = "activityArn", required = true)
    private String activityArn;

    /**
     * メインメソッドです。
     *
     * @param args コマンドライン引数
     */
    public static void main(String[] args) {
        SforceDownload client = new SforceDownload();
        client.execute(args);
    }

    /**
     * デフォルトコンストラクタです。
     */
    public SforceDownload() {
    }

    /*
     * (非 Javadoc)
     * @see jp.co.nes.awssupport.common.base.AbstractActivityTaskClient#getActivityArn()
     */
    @Override
    protected String getActivityArn() {
        return activityArn;
    }

    /*
     * (非 Javadoc)
     * @see jp.co.nes.awssupport.common.base.AbstractActivityTaskClient#getInputClass()
     */
    @Override
    protected Class<CommonInfoBean> getInputClass() {
        return CommonInfoBean.class;
    }

    /*
     * (非 Javadoc)
     * @see jp.co.nes.awssupport.common.base.AbstractActivityTaskClient#runActivityTask(jp.co.nes.awssupport.common.bean.BaseBean)
     */
    @Override
    protected CommonContainerBean<CommonInfoBean> runActivityTask(CommonInfoBean input) {
        Map<String, String> other = input.getOther();
        boolean isCompileProgress = true;
        if (Boolean.parseBoolean(other.get("sforceDownloadWithNotCompileProgress"))) {
            isCompileProgress = false;
        }

        if (isCompileProgress) {
            // 集計進捗状況管理を開始する。
            CompileProgressManage.start();
        }

        OtherKeyForTargetYearMonth[] keys = OtherKeyForTargetYearMonth.values();
        for (OtherKeyForTargetYearMonth key : keys) {
            String targetYearMonthValue = other.get(key.getMapKey());
            if (StringUtils.isEmpty(targetYearMonthValue)) {
                if (logger.isDebugEnabled()) {
                    logger.debug("targetYearMonthValue is null or empty(key=" + key + ")");
                }
                continue;
            }

            if (logger.isDebugEnabled()) {
                if (logger.isDebugEnabled()) {
                    logger.debug("targetYearMonthValue is exist(key=" + key + ")");
                }
            }

            // 契約情報をダウンロードする。
            YearMonth targetYearMonth = DateUtil.toYearMonth(targetYearMonthValue);
            ContractInformationManage ciManage = createContractInformationManage(targetYearMonth);
            List<String> linkedAccountIdList = ciManage.download();
            if (linkedAccountIdList.isEmpty()) {
                // 1件も集計するものが存在しない場合はエラーとする(通常、存在しないことはありえない)
                throw new CommonException("ContractInformation is not exist");
            }

            if (isCompileProgress) {
                // 集計進捗状況管理の初期データを作成する。
                CompileProgressManage.createData(targetYearMonth, linkedAccountIdList);
            }
        }

        // 返却内容の設定
        CommonInfoBean info = new CommonInfoBean();
        BeanUtil.copyProperties(info, input);
        CommonContainerBean<CommonInfoBean> output = new CommonContainerBean<>();
        output.setInfoBean(info);
        output.setProcessingResult(ProcessingResult.SUCCESS);
        return output;
    }

    /**
     * 契約情報管理を生成します。
     *
     * @param targetYearMonth 処理対象年月
     * @return 契約情報管理
     */
    protected ContractInformationManage createContractInformationManage(YearMonth targetYearMonth) {
        return new ContractInformationManage(targetYearMonth);
    }

    /*
     * (非 Javadoc)
     * @see jp.co.nes.awssupport.common.base.AbstractClient#debugArgument()
     */
    @Override
    protected void debugArgument() {
        if (logger.isDebugEnabled()) {
            logger.debug("activityArn=" + activityArn);
        }
    }
}
